package core

import (
	"sync"
	"go-iot/app/iot/eventbus"
	"go-iot/app/iot/eventbus/message"
)

var manager sync.Map

type Session interface {
	// 断开连接并使离线
	Disconnect() error
	// 获取设备id
	GetDeviceId() string
	// 设置设备id，对于无法重连接中得到设备id的场景需要手动调用
	SetDeviceId(deviceId string)
	// 关闭会话
	Close() error
	// 连接信息
	GetInfo() map[string]any
}

// 设备上线事件
func DeviceOnlineEvent(deviceId, productId string) {
	evt := message.NewOnlineMessage(deviceId, productId)
	eventbus.PublishOnline(&evt)
}

// 设备离线事件
func DeviceOfflineEvent(deviceId, productId string) {
	evt := message.NewOfflineMessage(deviceId, productId)
	eventbus.PublishOffline(&evt)
}

// 获取设备Session
func GetSession(deviceId string) Session {
	if val, ok := manager.Load(deviceId); ok {
		return val.(Session)
	}
	return nil
}

// 放入到Session管理器中
func SetSession(deviceId string, session Session, replace bool) {
	manager.Store(deviceId, session)
	device := GetDevice(deviceId)
	if device != nil && !replace {
		DeviceOnlineEvent(deviceId, device.GetProductId())
	}
}

// 删除设备Session
func DelSession(deviceId string) {
	if _, ok := manager.LoadAndDelete(deviceId); ok {
		device := GetDevice(deviceId)
		if device != nil {
			DeviceOfflineEvent(deviceId, device.GetProductId())
		}
	}
}
